
//todo
// 假设有k个人质和k个绑匪围成一圈。人质的编号从1到k，绑匪的编号从k+1到2k。
// 从编号1开始，每次从其中选出第m个人(隔m-1选出一人)出列。
// 希望求出m的最小值，使得最先出列的k个人都是绑匪，即都是编号从k+1到2k的人。
#include "iostream"
#include "vector"
#include "unordered_map"
#include "algorithm"

int down_node(int node,int depth){
    return node+depth+1;
}
int right_node(int node,int depth){
    return node+depth+2;
}
int recur(std::vector<int> &buf,int node,int depth){

    if(node>=buf.size()){
        return 0;
    }
    auto cur=buf[node];
    int a=recur(buf, down_node(node,depth),depth+1);
    int b=0;
    b=recur(buf, right_node(node,depth),depth+1);

    return buf[node]+ std::max(a,b);
}

int main() {
    int a;
//    int
//    is_huiwen(1441,10);
    while (std::cin >> a) {
        std::vector<int> buf((1+a)*a/2);
        for(int i=0;i<buf.size();i++){
            std::cin>>buf[i];
        }
        int max=recur(buf,0,0);
        printf("%d\n",max);
    }
//    while(1){}
    return 0;
}

